﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using SIGEB.Prototipo.Control;
using SIGEB.Modelo;
using SIGEB.Modelo.moduloDocumentos;
using SIGEB.Modelo.moduloPerfiles;

namespace SIGEB.Prototipo.Vista.moduloConsulta
{
    public partial class frm_Consultas : frm_ModuloBase
    {
        #region "constructores"

        public frm_Consultas()
        {
            InitializeComponent();
            datosDocumentos = new LinkedList<documento>();
            agregarColumnas();
        }

        public frm_Consultas(controlPrincipal cp):base(cp)
        {
            InitializeComponent();
            datosDocumentos = new LinkedList<documento>();
            docActual = null;
            asignarUI(this.Controls);
            agregarColumnas();
        }

        #endregion

        #region "metodos"

        public override void hacerVisible(object[] arg)
        {
            base.hacerVisible(arg);
            if (!cp.usuarioActualPuede(acciones.CONSULTA_CONSULTAR))
            {
                gpb_infoBusqueda.Enabled = false;
            }
            else
            {
                gpb_infoBusqueda.Enabled = true;
            }
            if(!cp.usuarioActualPuede(acciones.RESERVA_AGREGAR_ACT))
            {
                btn_solicitar.Enabled = false;
            }
            else
            {
                btn_solicitar.Enabled = true;
            }
        }

        private void estadoPredeterminado()
        {
            estadoPredeterminadoBusqueda();
            estadoPredeterminadoDetalle();
        }

        private void estadoPredeterminadoBusqueda()
        {
            cmb_tipoBusqueda.SelectedIndex = -1;
            txb_campoBusqueda.Text = string.Empty;
            docActual = null;
            datosDocumentos.Clear();
            dgv_busqueda.ClearSelection();
            dgv_busqueda.Rows.Clear();
            lbl_mensajes.Text = string.Empty;
        }

        private void estadoPredeterminadoDetalle()
        {
            txb_ejemplaresDisponibles.Text = string.Empty;
            txb_clasificacion.Text = string.Empty;
            txb_serie.Text = string.Empty;
            txb_editorial.Text = string.Empty;
            txb_descriptores.Text = string.Empty;
        }

        private void agregarColumnas()
        {
            dgv_busqueda.Columns.Add("columnaCodigoDocumento", "Codigo");
            dgv_busqueda.Columns["columnaCodigoDocumento"].Visible = false;
            dgv_busqueda.Columns.Add("columnaAutor", "Autor");
            dgv_busqueda.Columns.Add("columnaTitulo", "Título");
            dgv_busqueda.Columns.Add("columnaTipoDocumento", "Tipo de Documento"); 
        }

        private string capturarBusquedaIngresada()
        {
            return txb_campoBusqueda.Text;
        }

        private void buscarCodigo()
        {
            datosDocumentos.Clear();
            try
            {
                documento docCodigo = cp.ctrlDocumentos.documentoCodigoConsulta(capturarBusquedaIngresada());
                if (docCodigo != null)
                {
                    datosDocumentos.AddLast(docCodigo);
                    dgv_busqueda.Rows.Add(new object[] { docCodigo.codDocumento, docCodigo.autorD.nombre, docCodigo.titulo, docCodigo.atributos.nombre });
                }
                else
                {
                    mostrarInfo("El criterio de búsqueda ingresado no generó ningún resultado.");
                }
            }
            catch (Exception ex)
            {
                ventanaError(ex.Message);
            }
        }

        private void buscarAutor()
        {
            datosDocumentos.Clear();
            try
            {
                datosDocumentos = cp.ctrlDocumentos.documentoAutor(capturarBusquedaIngresada());
            }
            catch (Exception ex)
            {
                ventanaError(ex.Message);
            }
            if (datosDocumentos != null && datosDocumentos.Count > 0)
            {
                foreach (documento doc in datosDocumentos)
                {
                    dgv_busqueda.Rows.Add(new object[] { doc.codDocumento, doc.autorD.nombre, doc.titulo, doc.atributos.nombre });
                }
            }
            else
            {
                mostrarInfo("El criterio de búsqueda ingresado no generó ningún resultado.");
            }
        }

        private void buscarTitulo()
        {
            datosDocumentos.Clear();
            try
            {
                datosDocumentos = cp.ctrlDocumentos.documentoTitulo(capturarBusquedaIngresada());
            }
            catch (Exception ex)
            {
                ventanaError(ex.Message);
            }
            if (datosDocumentos != null && datosDocumentos.Count > 0)
            {
                foreach (documento doc in datosDocumentos)
                {
                    dgv_busqueda.Rows.Add(new object[] { doc.codDocumento, doc.autorD.nombre, doc.titulo, doc.atributos.nombre });
                }
            }
            else
            {
                mostrarInfo("El criterio de búsqueda ingresado no generó ningún resultado.");
            }
        }

        private void buscarLibre()
        {
            datosDocumentos.Clear();
            try
            {
                datosDocumentos = cp.ctrlDocumentos.documentoLibre(capturarBusquedaIngresada());
            }
            catch (Exception ex)
            {
                ventanaError(ex.Message);
            }
            if (datosDocumentos != null && datosDocumentos.Count > 0)
            {
                foreach (documento doc in datosDocumentos)
                {
                    dgv_busqueda.Rows.Add(new object[] { doc.codDocumento, doc.autorD.nombre, doc.titulo, doc.atributos.nombre });
                }
            }
            else
            {
                mostrarInfo("El criterio de búsqueda ingresado no generó ningún resultado.");
            }
        }

        private documento obtenerDocumentoSeleccionado(string codDocumento)
        {
            if(datosDocumentos != null && datosDocumentos.Count > 0)
            {            
                foreach(documento doc in datosDocumentos)
                {
                    if (doc.codDocumento.Equals(codDocumento))
                        return doc;
                }
            }
            return null;
        }

        #endregion

        #region "eventos"

        private void dgv_busqueda_SelectionChanged(object sender, EventArgs e)
        {
            if (p)
            {
                dgv_busqueda.ClearSelection();
            }
        }

        private void cmb_tipoBusqueda_SelectedIndexChanged(object sender, EventArgs e)
        {
            switch (cmb_tipoBusqueda.SelectedIndex)
            {
                case 0: modo = 0; break;
                case 1: modo = 1; break;
                case 2: modo = 2; break;
                case 3: modo = 3; break;
            }
        }

        private void btn_buscar_Click(object sender, EventArgs e)
        {
            estadoPredeterminadoDetalle();

            if(dgv_busqueda.Rows.Count > 0)
            {
                dgv_busqueda.Rows.Clear();
            }

            if (!cmb_tipoBusqueda.SelectedIndex.Equals(-1))
            {
                if (!capturarBusquedaIngresada().Equals(string.Empty))
                {
                    switch (modo)
                    {
                        case 0: buscarCodigo(); break;
                        case 1: buscarAutor(); break;
                        case 2: buscarTitulo(); break;
                        case 3: buscarLibre(); break;
                    }
                    p = true;
                }
                else
                {
                    lbl_mensajes.Text = "Debe ingresar un criterio de búsqueda antes de continuar.";
                }
            }
            else
            {
                lbl_mensajes.Text = "Debe seleccionar el tipo de búsqueda a efectuar.";
            }
        }

        private void btn_solicitar_Click(object sender, EventArgs e)
        {
            if (docActual != null)
            {
                cp.ctrlReservas.crearReserva(new reserva(null, DateTime.Now, DateTime.Now.AddDays(1), cp.UsuarioActual, docActual.codDocumento));
                mostrarInfo("El documento se ha reservado satisfactoriamente.");
            }
            else
            {
                lbl_mensajes.Text = "Seleccione un documento antes de realizar la solicitud de reserva.";
            }
        }

        protected override void CerrarVentana(object sender, FormClosingEventArgs e)
        {
            base.CerrarVentana(sender, e);
            estadoPredeterminado();
        }

        private void dgv_busqueda_MouseDown(object sender, MouseEventArgs e)
        {
            try
            {
                if (e.Button.Equals(MouseButtons.Left))
                {
                    var hti = dgv_busqueda.HitTest(e.X, e.Y);
                    if (!(hti.RowIndex.Equals(-1) && hti.ColumnIndex.Equals(-1)))
                    {
                        p = false;
                        dgv_busqueda.Rows[hti.RowIndex].Selected = true;
                        docActual = obtenerDocumentoSeleccionado(dgv_busqueda.Rows[hti.RowIndex].Cells[0].Value.ToString());
                        if (docActual != null)
                        {
                            txb_ejemplaresDisponibles.Text = docActual.disponibles().ToString();
                            txb_clasificacion.Text = docActual.clasificacion;
                            txb_serie.Text = docActual.serie;
                            txb_editorial.Text = docActual.editorialD.nombre;
                            txb_descriptores.Text = docActual.descriptores;
                        }
                        else
                        {
                            txb_ejemplaresDisponibles.Text = string.Empty;
                            txb_clasificacion.Text = string.Empty;
                            txb_serie.Text = string.Empty;
                            txb_editorial.Text = string.Empty;
                            txb_descriptores.Text = string.Empty;
                        }               
                    }
                }
            }
            catch
            {
                return;
            }
        }

        #endregion

        #region "atributos"

        private bool p = true;
        private int modo = -1;
        private documento docActual;
        private LinkedList<documento> datosDocumentos;

        #endregion
    }
}

